package newx
{
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.events.Event;
	
	
	/**
	 *  显示对象容器，它在Sprite的基础上提供了便于管理的data属性用于扩展属性，并提供了简单的呈现方法show
	 * @author wangjun
	 * 
	 */	
	public class NxSprite extends Sprite
	{
		private var _data			:BaseObject;
		
		private var _addedCallBack	:Function;
		
		public function NxSprite()
		{
			super();
		}
		
		/**
		 * 获取data对象，用于保存动态属性。 
		 * @return 
		 * @see newx.BaseObject.GetProperties<br>
		 * @see newx.BaseObject.HandleProperties<br>
		 * @see newx.BaseObject.DeleteProperties<br>
		 * @see newx.BaseObject.CheckProperties<br>
		 * 
		 */		
		public function get data():BaseObject
		{
			if(_data == null)
			{
				_data	=	new BaseObject();
			}
			return _data;
		}

		/**
		 * 设置data对象的引用，由于data由系统创建，因此调用此方法设置将会引发错误，
		 * 如果要设置动态属性请调用data对象的相关方法进行操作。
		 * @param value
		 */		
		public function set data(value:BaseObject):void
		{
			throw new Error("NxSprite.data 属性只能系统创建！");
			return;
		}

		/**
		 * 显示容器，将显示容器添加到显示列表。 
		 * @param space			父级显示容器。
		 * @param addedCallBack	AddChild后的回调。
		 * 
		 */		
		public function show(space:DisplayObjectContainer	= null,addedCallBack:Function = null,...argc):void
		{
			_addedCallBack	=	addedCallBack;
			if(parent == null)
			{
				if(space == null)
				{
					throw new Error("参数space为null，无法将显示添加到未知对象中。")
					if(_addedCallBack!=null)
					{
						_addedCallBack.call(this,this);
					}
				}
				else
				{
					if(_addedCallBack!=null)
					{
						addEventListener(Event.ADDED_TO_STAGE,onSelfBeAdd);
					}
					space.addChild(this);
				}
			}
			else
			{
				visible	=	true;
				
				if(_addedCallBack!=null)
				{
					_addedCallBack.call(this,this);
				}				
			}			
		}
		
		/**
		 * 将显示对象从显示列表中移除。
		 * 如果只是隐藏显示对象，请设置visible属性。
		 * 
		 */		
		public function hide():void
		{
			if(parent!=null)
			{
				parent.removeChild(this);		
			}
		}
		
		private function onSelfBeAdd(e:Event):void
		{
			removeEventListener(Event.ADDED_TO_STAGE,onSelfBeAdd);
			visible	=	true;
			_addedCallBack.call(this,this);
		}
	}
}